import java.util.HashMap;

public class question_03 {
}
class Solution_03 {
    public int lengthOfLongestSubstring(String s) {
        //先尝试使用暴力算法求解会怎么样
//        char[] arr = s.toCharArray();
//        if(arr.length==0)
//            return 0;
//        int max=0;//用来返回的值
//        for (int i = 0; i < arr.length; i++) {
//            int sum=0;
//            HashMap<Object,Object> hashmap = new HashMap<>();
//            for (int j = i; j < arr.length; j++) {
//                if(hashmap.get(arr[j])==null){
//                    hashmap.put(arr[j],1);
//                    sum++;//长度加一
//                }else{
//                    if(sum>max)
//                        max=sum;//更新最大值
//                    break;//说明已经出现重复的了，可以跳出此次循环了
//                }
//            }
//        }
//        return max;



        // 记录字符上一次出现的位置,用滑动窗口的方法进行求解
        if(s == null || s.length() <= 0 || s == "")
            return 0;
        char arr[]=s.toCharArray();//将字符串转化成字符数组
        HashMap <Character,Integer> hashmap = new HashMap<>();
        int start=0;//表示窗口开始的索引位置
        int max=0;//用来记录最长子串的
        int num=0;//用于判断在这过程中是否出现过重复的数字
        int len=s.length();
        for (int i = 0; i < len; i++) {
            if(hashmap.get(arr[i]) == null){//表示这个还没出现过
                hashmap.put(arr[i],i);
            }else{
                num++;//表示出现了重复的数字
                //之前已经出现过了，分两种情况
                int index=hashmap.get(arr[i]).intValue();
                if(index<start)//表示之前已经出现过的值已不在新的计算字段内
                {//所以只需要做简单的覆盖就可以了
                    hashmap.put(arr[i],i);
                }else{

                    //不仅得覆盖，还得判断是否需要更新max的值
                    if((i-start)>max)
                        max=i-start;
                    start=index+1;//更新窗口开始边界
                    hashmap.put(arr[i],i);//覆盖新的值
                }
            }

        }
        if(num==0)
            return len;
        else
            return max;
    }
}